package com.lagou.controller;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.lagou.entity.UserDTO;
import com.lagou.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 */
@RestController
@RequestMapping("user")
@CrossOrigin
public class AuthorityContoller {

    @Autowired
    private UserService userService;

    @GetMapping("login")
    public UserDTO login(String phone, String password){
        UserDTO dto = userService.login(phone, password);
        return dto;
    }

    @GetMapping("checkToken")
    public UserDTO checkToken(String token){
        System.out.println("待校验的token = " + token);
        UserDTO dto = userService.checkToken(token);
        return dto;
    }

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @GetMapping("logout")
    public void logout(String token) {
        System.out.println(1);
        System.out.println(token);
        redisTemplate.delete(token);
    }

    //下面就是之前说的重要的四个数据
    //签名名称
    @Value("${ali.sms.signName}")
    private String signName;

    //模板的code
    @Value("${ali.sms.templateCode}")
    private String templateCode;

    //下面是对应的用户创建的两个重要数据
    @Value("${ali.sms.assessKeyId}")
    private String assessKeyId;

    @Value("${ali.sms.assessKeySecret}")
    private String assessKeySecret;

    @GetMapping("sendSms")
    public Object sendSms(String phoneNumber) {
        System.out.println(phoneNumber);
        //指定发送者
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", assessKeyId, assessKeySecret);

        //创建发送对象
        IAcsClient client = new DefaultAcsClient(profile);

        //创建消息设置对象
        CommonRequest request = new CommonRequest();
        //通常来说老版本没有Sys的添加，你可以删除Sys可以发现是过时的方法，比如4.1.0版本，就没有Sys的添加
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phoneNumber); //手机号，指定接收者
        //下面指定消息内容
        request.putQueryParameter("SignName", signName); //签名名称
        request.putQueryParameter("TemplateCode", templateCode); //模板code

        //操作验证码
        String vcode = "";
        for(int i = 0; i<6; i++){
            vcode = vcode + (int)(Math.random()*9+1); //生成1到9之间的整数（包括1和9）
        }
        //定义参数的值，通常来说，操作验证码的操作基本必须要指定code参数，在创建模板时，也是这样，需要指定，否则一般不会创建模板成功
        //request.putQueryParameter("TemplateParam", "{\"code\":\"" + vcode + "\"}");
        //request.putQueryParameter("TemplateParam", "{\"codee\":\"" + 1111 + "\",\"courseName\":\""+"好好"+"\"}");
        request.putQueryParameter("TemplateParam", "{\"code\":\"" + vcode + "\"}");
        try {

            //params must be [a-zA-Z0-9] for verification sms  请检查模板内容与模板参数是否匹配
            //让发送对象操作消息发送，因为依赖会使得我们的用户（我们创建的用户）来发送，所以我们也通常需要导入依赖（通常有地址，从而导致用户发送）
            //所以自然不是我们自己的程序来发送的
            CommonResponse response = client.getCommonResponse(request);
            //返回结果
            System.out.println(response.getData());
            //一般这里可能会出现对应的问题，比如json不合法（或者不匹配），或者业务停机等等
            //一般来说，如果是业务停机，代表我们并没有操作失败，只是对应已经停机而已
            //大概是没钱了，或者没有开启短信使用
            //如果对应的四个参数错误了，那么也会出现对应的错误提示

            //否则通常没有什么错误的出现，那么后面自然返回true，否则都会返回false

            String jsonStr = response.getData();
            JSONObject jsonObject = JSONObject.parseObject(jsonStr);
            jsonObject.put("Message","OK");
            if("OK".equals(jsonObject.get("Message"))){
                System.out.println(88);
                //返回手机号和验证码
                jsonObject.put("phoneNumber",phoneNumber);
                jsonObject.put("smsCode",vcode);
                return jsonObject;
           }
            System.out.println(1);
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }

        return null;
    }

    @GetMapping("loginPhoneSms")
    public UserDTO loginPhoneSms(String phoneNumber) {
        return userService.loginPhoneSms(phoneNumber);
    }

}